package cn.skylark.wcm.service.impl;

import cn.skylark.wcm.dao.FileTableDao;
import cn.skylark.wcm.entity.Filetable;
import cn.skylark.wcm.service.RecycleService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.github.pagehelper.StringUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;


/**
 *  *Description:回收站实装类
 *  *
 *  *Copyright:wcm
 *  *@author 武文旭
 *  *@version 1.0 
 *
 * @date 2018/01/08
 *  
 */
@Service
public class RecycleServiceImpl implements RecycleService {
    /**
     * logger
     */
    private static final Logger LOGGER=LoggerFactory.getLogger(RecycleServiceImpl.class);
    @Autowired
    public FileTableDao fileTableDao;

    /**
     * 分页查询获取所有的已删除文件信息
     * 业务:查询条件是userid和tenanid
     *
     * @param filetable
     * @param start
     * @param length
     * @return
     */
    @Override
    public PageInfo<Filetable> selectByPage(Filetable filetable, String searchValue, String flag, int start, int length) {
        LOGGER.info("分页获取已删文件信息--文件" + filetable + "启始页" + start + "条数" + length);
        int page=start / length + 1;
        // 分页查询
        Example example=new Example(Filetable.class);
        Example.Criteria criteria=example.createCriteria();
        if (StringUtil.isNotEmpty(searchValue)) {
            criteria.andLike("filename", "%" + searchValue + "%");
        }
        if ("0".equals(flag)) {
            criteria.andEqualTo("userid", filetable.getUserid());
            criteria.andNotEqualTo("type", 3);
            criteria.andCondition("recycleflg=id");
            criteria.andEqualTo("delflg", 1);
        } else if ("1".equals(flag)) {
            criteria.andNotEqualTo("type", 3);
            criteria.andCondition("recycleflg=id");
            criteria.andEqualTo("delflg", 1);
        }
        example.setOrderByClause("updatetime desc");
        PageHelper.startPage(page, length);
        List<Filetable> filetableList=fileTableDao.selectByExample(example);
        LOGGER.info("分页获取用户信息结束");
        return new PageInfo<>(filetableList);
    }

    /**
     * 从回收站复原数据
     * 业务：1、将filetable表中的数据进行变更
     *
     * @param filetable filetable对象
     */
    @Override
    public void recoveryFile(Filetable filetable) {
        LOGGER.info("从回收站复原数据 文件=" + filetable.getId() + "文件后缀=" + filetable.getSuffix());
        //判断suffix是否为空
        if (filetable.getSuffix() != null && !"".equals(filetable.getSuffix())) {
            //文件情况
            //将回收站的txt文件也进行恢复
            if (filetable.getType() == 1) {
                Filetable filetableTxt=new Filetable();
                filetableTxt.setRecycleflg(filetable.getRecycleflg());
                filetableTxt.setType(3);
                Filetable filetableTxtMessage=fileTableDao.selectOne(filetableTxt);
                filetableTxtMessage.setRecycleflg(null);
                fileTableDao.recoveryFile(filetableTxtMessage);
            }
            filetable.setRecycleflg(null);
            filetable.setUpdatetime(new Date());
            //将flg为0，Rflg=null
            fileTableDao.recoveryFile(filetable);
            createFolder(filetable);
        } else {
            //是文件夹
            Example example=new Example(Filetable.class);
            Example.Criteria criteria=example.createCriteria();
            criteria.andEqualTo("recycleflg", filetable.getId());
            criteria.andEqualTo("type", filetable.getType());
            criteria.andEqualTo("userid", filetable.getUserid());
            List<Filetable> filetableList=fileTableDao.selectByExample(example);
            for (Filetable filetableId : filetableList) {
                filetableId.setRecycleflg(null);
                filetableId.setUpdatetime(new Date());
                //将flg为0，Rflg=null
                fileTableDao.recoveryFile(filetableId);
            }
            if (filetable.getType() == 1) {
                //txt文件恢复
                Example exampleTxt=new Example(Filetable.class);
                Example.Criteria criteriaTxt=exampleTxt.createCriteria();
                criteria.andEqualTo("recycleflg", filetable.getId());
                criteria.andEqualTo("type", 3);
                criteria.andEqualTo("userid", filetable.getUserid());
                List<Filetable> filetableListTxt=fileTableDao.selectByExample(exampleTxt);
                for (Filetable filetableIdTxt : filetableListTxt) {
                    filetableIdTxt.setRecycleflg(null);
                    filetableIdTxt.setUpdatetime(new Date());
                    //将flg为0，Rflg=null
                    fileTableDao.recoveryFile(filetableIdTxt);
                }
            }

            createFolder(filetable);
        }
        LOGGER.info("从回收站复原数据结束");
    }

    /**
     * 置换数据
     *
     * @param filetable
     * @return
     */
    @Override
    public Filetable ChangeValue(Filetable filetable) {
        LOGGER.info("置换数据开始");
        Filetable oldfiletable=new Filetable();
        oldfiletable.setUserid(filetable.getUserid());
        oldfiletable.setType(filetable.getType());
        oldfiletable.setSuffix(filetable.getSuffix());
        oldfiletable.setFilename(filetable.getFilename());
        oldfiletable.setLocalpath(filetable.getLocalpath());
        LOGGER.info("置换数据结束");
        return oldfiletable;
    }

    /**
     * 创建文件夹
     *
     * @param filetable
     * @return
     */
    @Override
    public void createFolder(Filetable filetable) {
        LOGGER.info("创建文件夹开始 文件路径" + filetable.getLocalpath());
        if (!"".equals(filetable.getLocalpath())) {
            String localpath=filetable.getLocalpath();
            List<String> array=new ArrayList<>();
            array.add(localpath);
            List<String> list=new ArrayList();
            for (String message : array) {
                if (message.indexOf("/") == -1) {
                    list.add(message + "/");
                } else {
                    String[] aa=message.split("/");
                    StringBuffer stringBuffer=new StringBuffer();
                    for (int i=0; i < aa.length; i++) {
                        stringBuffer.append(aa[i] + "/");
                        list.add(stringBuffer.toString());
                    }
                }
            }
            String[] arrayResult=(String[]) list.toArray(new String[list.size()]);
            String tmpFilename=null;
            String llocalpath=null;
            for (int i=0; i < arrayResult.length; i++) {
                String string=arrayResult[i];
                String strArray=string.substring(0, string.lastIndexOf("/"));
                if (strArray.lastIndexOf("/") < 1) {
                    tmpFilename=strArray;
                    llocalpath="";
                    Filetable filetableMessage=new Filetable();
                    filetableMessage.setFilename(tmpFilename);
                    filetableMessage.setLocalpath(llocalpath);
                    filetableMessage.setType(filetable.getType());
                    filetableMessage.setTenanid(filetable.getTenanid());
                    filetableMessage.setUserid(filetable.getUserid());
                    filetableMessage.setDelflg(0);
                    filetableMessage.setRecycleflg(null);
                    filetableMessage.setType(filetable.getType());
                    filetableMessage.setSuffix("");
                    filetableMessage.setSize("");
                    if (fileTableDao.selectCount(filetableMessage) == 0) {
                        fileTableDao.insert(filetableMessage);
                    }
                } else {
                    String name=strArray.substring(strArray.lastIndexOf("/") + 1, strArray.length());
                    String pathL=strArray.substring(0, strArray.lastIndexOf("/"));
                    tmpFilename=name;
                    llocalpath=pathL + "/";
                    Filetable filetableMessage=new Filetable();
                    filetableMessage.setFilename(tmpFilename);
                    filetableMessage.setLocalpath(llocalpath);
                    filetableMessage.setType(filetable.getType());
                    filetableMessage.setTenanid(filetable.getTenanid());
                    filetableMessage.setUserid(filetable.getUserid());
                    filetableMessage.setSuffix("");
                    filetableMessage.setDelflg(0);
                    filetableMessage.setSize("");
                    filetableMessage.setRecycleflg(null);
                    filetableMessage.setType(filetable.getType());
                    if (fileTableDao.selectCount(filetableMessage) == 0) {
                        fileTableDao.insert(filetableMessage);
                    }
                }
            }
        }
        LOGGER.info("创建文件夹j结束");
    }

    /**
     * 替换文件及文件夹
     * 业务:知道之前文件或文件夹已存在，并替换
     *
     * @param filetable
     */
    @Override
    public void replaceFile(Filetable filetable, List<Filetable> filetableList) {
        LOGGER.info("替换文件及文件夹开始 文件id=" + filetable.getId() + "文件后缀=" + filetable.getSuffix());
        //判断suffix是否为空
        if (filetable.getSuffix() != null && !"".equals(filetable.getSuffix())) {
            //删除文件
            for (Filetable filetableMessage : filetableList) {
                del(filetableMessage.getId());
            }
            //恢复文件
            recoveryFile(filetable);
        } else {
            //删除文件夹信息
            Example example=new Example(Filetable.class);
            Example.Criteria criteria=example.createCriteria();
            criteria.andEqualTo("recycleflg", filetable.getId());
            criteria.andEqualTo("type", filetable.getType());
            criteria.andEqualTo("userid", filetable.getUserid());
            List<Filetable> filetableDeleteList=fileTableDao.selectByExample(example);
            for (Filetable filetableId : filetableDeleteList) {
                Filetable filetableMessage=ChangeValue(filetableId);
                filetableMessage.setRecycleflg(null);
                filetableMessage.setDelflg(0);
                if (fileTableDao.selectCount(filetableMessage) == 1) {
                    del(fileTableDao.selectOne(filetableMessage).getId());
                }
                //将flg为0，Rflg=null
                fileTableDao.recoveryFile(filetableId);
            }
            //恢复文件夹信息
            recoveryFile(filetable);
        }
        LOGGER.info("替换文件及文件夹结束");
    }

    /**
     * 获取重复文件
     *
     * @param filetable
     * @return
     */
    @Override
    public List<Filetable> getRepeatFile(Filetable filetable) {
        LOGGER.info("获取重复文件开始 文件id=" + filetable.getId() + "文件后缀=" + filetable.getSuffix());
        List<Filetable> filetableList=new ArrayList<>();
        if (filetable.getSuffix() == null || "".equals(filetable.getSuffix())) {
            //文件夹情况
            Example example=new Example(Filetable.class);
            Example.Criteria criteria=example.createCriteria();
            criteria.andEqualTo("recycleflg", filetable.getId());
            criteria.andEqualTo("type", filetable.getType());
            criteria.andEqualTo("userid", filetable.getUserid());
            List<Filetable> filetableDeleteList=fileTableDao.selectByExample(example);
            for (Filetable filetableId : filetableDeleteList) {
                Filetable filetableMessage=ChangeValue(filetableId);
                filetableMessage.setDelflg(0);
                filetableMessage.setRecycleflg(null);
                if (fileTableDao.selectCount(filetableMessage) > 0) {
                    filetableList.add(fileTableDao.selectOne(filetableMessage));
                }
            }
        } else {
            //文件情况
            Filetable filetableMessage=ChangeValue(filetable);
            filetableMessage.setDelflg(0);
            filetableMessage.setRecycleflg(null);
            if (fileTableDao.selectCount(filetableMessage) > 0) {
                filetableList.add(fileTableDao.selectOne(filetableMessage));
            }
        }
        LOGGER.info("获取重复文件结束 返回数量=" + filetableList.size());
        return filetableList;
    }


    /**
     * 通过id来获取filetable对象
     * 业务：通过id获取文件对象
     *
     * @param filetable
     * @return
     */
    @Override
    public Filetable getFiletable(Filetable filetable) {
        LOGGER.info("通过f文件id查看文件开始 文件Id=" + filetable.getId());
        Filetable deletefiletable=fileTableDao.selectOne(filetable);
        LOGGER.info("通过文件id查看文件结束");
        return deletefiletable;
    }

    /**
     * 表数据删除方法
     * 业务：物理删除方法
     *
     * @param id
     */
    @Override
    public void del(Integer id) {
        Example example=new Example(Filetable.class);
        LOGGER.info("表数据删除方法开始 文件id" + id);
        Example.Criteria criteria=example.createCriteria();
        criteria.andEqualTo("id", id);
        LOGGER.info("表数据删除方法结束");
        fileTableDao.deleteByExample(example);
    }

    /**
     * 彻底删除文件
     * 业务,将文件从表数据中删除
     *
     * @param filetable
     */
    @Override
    public void deleteFileThorough(Filetable filetable) {
        LOGGER.info("彻底删除文件开始 删除文件id" + filetable.getId());
        if ("".equals(filetable.getSuffix()) || filetable.getSuffix() == null) {
            //这里加的recycleflg状态是为了在删除时区分是不是这个文件夹的东西
            Example example=new Example(Filetable.class);
            Example.Criteria criteria=example.createCriteria();
            criteria.andEqualTo("recycleflg", filetable.getId());
            criteria.andEqualTo("type", filetable.getType());
            criteria.andEqualTo("userid", filetable.getUserid());
            List<Filetable> filetableList=fileTableDao.selectByExample(example);
            for (Filetable filetableMessage : filetableList) {
                del(filetableMessage.getId());
            }
        } else {
            this.del(filetable.getId());
        }
        LOGGER.info("彻底删除文件结束");
    }


    /**
     * 清空回收站
     * 业务:清空用户数据
     *
     * @param filetable
     */
    @Override
    public void emptyRecycle(Filetable filetable, String flag) {
        LOGGER.info("清空回收站开始 用户id" + filetable.getUserid());
        Example example=new Example(Filetable.class);
        Example.Criteria criteria=example.createCriteria();
        if ("0".equals(flag)) {
            criteria.andEqualTo("userid", filetable.getUserid());
            criteria.andEqualTo("delflg", 1);
        } else if ("1".equals(flag)) {
            criteria.andEqualTo("delflg", 1);
        }
        LOGGER.info("清空回收站结束");
        fileTableDao.deleteByExample(example);
    }

}
